﻿#pragma once
namespace LK
{
	namespace Reflection
	{
		struct PNamespaceNode:PDomainNode
		{
			PMETHODS(PNamespaceNode,NamespaceNode);
			/**
			@brief 构造一个命名空间*/
			PNamespaceNode(ptr<String> const& name, weakptr<TypeLibrary> const& library = Convert<weakptr<TypeLibrary> const&,ptr<Object>>::RefFrom(ptr<Object>()), PNamespaceNode const&baseNode = (PNamespaceNode const&)ptr<LibraryNode>::EmptyNode);
			/**
			@brief 获取类型节点数组*/
			ptr<Collection::IArray<PTypeNode>> GetTypeNodeArray()const;
			/**
			@breif 查找当前节点下指定名称的命名空间节点，如果不存在则进行添加。
			@note 命名空间名称中如果包含分隔符，则进行子层查找和创建*/
			PNamespaceNode FindOrAddNamespace(ptr<String> const&path)const;
			/**
			@breif 在当前命名空间查找或添加指定的类型节点。
			@note 名称中如果包含分隔符，则进行子层查找或创建*/
			PTypeNode FindOrAddTypeNode(ptr<String> const&path,ptr<Type> const&t=ptr<Type>())const;
		};
		struct NamespaceNode:DomainNode
		{
			//通用方法
			BMETHODS(PNamespaceNode, NamespaceNode)
			/**
			@brief 构造命名空间*/
			NamespaceNode( ptr<String> const& name = ptr<String>::GetEmpty(), weakptr<TypeLibrary> const& library=Convert<weakptr<TypeLibrary> const&,ptr<Object>>::RefFrom(ptr<Object>()), PNamespaceNode const&baseNode = (PNamespaceNode const&)ptr<LibraryNode>::EmptyNode);
			/**
			@brief 获取类型节点数组*/
			ptr<Collection::IArray<PTypeNode>> GetTypeNodeArray()const;
			/**
			@breif 查找当前节点下指定名称的命名空间节点，如果不存在则进行添加，返回引用。
			@note 命名空间名称中如果包含分隔符，则进行子层查找和创建*/
			PNamespaceNode FindOrAddNamespace(ptr<String> const&path);
			/**
			@breif 在当前命名空间查找或添加指定的类型节点。
			@note 名称中如果包含分隔符，则进行子层查找或创建*/
			PTypeNode FindOrAddTypeNode(ptr<String> const&path, ptr<Type> const&t = ptr<Type>());
		};
	}
}
